#include <ncurses.h>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <string>

using namespace std;

// 随机字符生成器
char randomChar() {
    return 33 + rand() % 94; // 可打印ASCII字符
}

// 数字雨滴类
class RainDrop {
private:
    int x;
    int y;
    int length;
    int speed;
    vector<char> chars;
    
public:
    RainDrop(int maxX, int maxY) {
        x = rand() % maxX;
        y = 0;
        length = 5 + rand() % 15;
        speed = 1 + rand() % 3;
        
        for (int i = 0; i < length; i++) {
            chars.push_back(randomChar());
        }
    }
    
    void update(int maxY) {
        y += speed;
        if (y - length > maxY) {
            y = 0;
        }
    }
    
    void draw() {
        if (y < 0) return;
        
        for (int i = 0; i < length; i++) {
            int currentY = y - i;
            if (currentY >= 0 && currentY < LINES) {
                if (i == 0) {
                    attron(COLOR_PAIR(1)); // 头部白色
                } else if (i == 1) {
                    attron(COLOR_PAIR(2)); // 次头部绿色
                } else {
                    attron(COLOR_PAIR(3)); // 身体淡绿色
                }
                
                mvaddch(currentY, x, chars[i]);
                
                if (i == 0) {
                    attroff(COLOR_PAIR(1));
                } else if (i == 1) {
                    attroff(COLOR_PAIR(2));
                } else {
                    attroff(COLOR_PAIR(3));
                }
            }
        }
    }
};

int main() {
    // 初始化ncurses
    initscr();
    cbreak();
    noecho();
    curs_set(0);
    timeout(0);
    
    // 检查颜色支持
    if (has_colors()) {
        start_color();
        init_pair(1, COLOR_WHITE, COLOR_BLACK);   // 头部颜色
        init_pair(2, COLOR_GREEN, COLOR_BLACK);   // 次头部颜色
        init_pair(3, COLOR_CYAN, COLOR_BLACK);    // 身体颜色
    }
    
    srand(time(0));
    
    vector<RainDrop> drops;
    for (int i = 0; i < 100; i++) {
        drops.push_back(RainDrop(COLS, LINES));
    }
    
    // 主循环
    while (true) {
        clear();
        
        // 更新和绘制所有雨滴
        for (auto &drop : drops) {
            drop.update(LINES);
            drop.draw();
        }
        
        // 检查退出条件
        if (getch() == 'q') {
            break;
        }
        
        refresh();
        napms(50); // 控制帧率
    }
    
    // 清理ncurses
    endwin();
    return 0;
}
